package kr.co.bettersoft.waitnumbercustomer.fragment;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import org.json.JSONArray;
import org.json.JSONObject;

import kr.co.bettersoft.waitnumbercustomer.activity.DummyActivity;
import kr.co.bettersoft.waitnumbercustomer.activity.MemberStoreInfoActivity;
import kr.co.bettersoft.waitnumbercustomer.activity.R;
import kr.co.bettersoft.waitnumbercustomer.activity.SearchStoreOptionActivity;
import kr.co.bettersoft.waitnumbercustomer.activity.myWebView;
import kr.co.bettersoft.waitnumbercustomer.adapter.MemberStoreListAdapter;
import kr.co.bettersoft.waitnumbercustomer.common.CommonConstant;
import kr.co.bettersoft.waitnumbercustomer.common.WaitNumberCustomerRest;
import kr.co.bettersoft.waitnumbercustomer.domain.BusinessKind;
import kr.co.bettersoft.waitnumbercustomer.domain.MemberUser;
import kr.co.bettersoft.waitnumbercustomer.domain.Merchant;
import kr.co.bettersoft.waitnumbercustomer.domain.MerchantSearchOption;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.Typeface;
import android.graphics.drawable.BitmapDrawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.TextView.OnEditorActionListener;

public class MemberStoreListFragment extends Fragment implements OnItemSelectedListener, OnEditorActionListener{
	String TAG = "MemberStoreListFragment";

	// 폰트
	private Typeface typefaceNanumGothic= null; 
//	private Typeface typefaceNanumGothicBold = null;

	
	final int SELECT_SEARCH_RECOMMENDATION_LIST = 501; 	// 가맹점 리스트를 가져온다.	// RestSelectSearchRecommendationList
	final int GET_MERCHANT_INFO = 503;				// 가맹점 정보를 가져온다. (이미지)
	
	final int LIST_ADD_UNIT = 10;		// 리스트가 하단에 도착했을때 추가되는 리스트 개수
	
	DummyActivity dummyActivity = (DummyActivity)DummyActivity.dummyActivity;

	/////////////////////////////////////////////////////////////////////////////

	// 서버 통신용
	WaitNumberCustomerRest waitNumberCustomerRest;
//	String callResult = "";
//	String tempstr = "";
	JSONObject jsonObject;
	// 중복 실행 방지용
	public static Boolean searched = false;		// 조회 했는가?
	int isRunning = 0;
	// 프래그먼트 종료 여부. 종료된 경우 스레드 호출로 인한 에러를 방지하기 위함
	Boolean isFinished = false;
	// 뒤로가기 버튼으로 닫을때 2번만에 닫히도록
	int app_end = 0;	

	// 설정 파일 저장소 
	SharedPreferences sharedPrefCustom;
	String memberId;		// pref 에 들어있는 고객 아이디
	// Img 가져올때 파일명만 있을 경우 앞에 붙일 도메인. 
	String imgthumbDomain = CommonConstant.imgThumDomain; 					

	// 가맹점 이름 표시
	int merchantNameMaxLength = 9;			// 가맹점명 표시될 최대 글자수.
	String newMerchantName="";				// 길이 제한된 가맹점 명

	// 스크롤시 추가 조회
	int indexDataFirst = 0;			// 부분 검색 위한 인덱스. 시작점
	int indexDataLast = 0;			// 부분 검색 위한 인덱스. 끝점
	int indexDataTotal = 0;			// 부분 검색 위한 인덱스. 전체 개수
	Boolean mIsLast = false;			// 끝까지 갔음. true 라면 더이상의 추가 없음. 새 조회시 false 로 초기화
	Boolean adding = false;			// 데이터 더하기 진행 중임.
	Boolean newSearch = false; 		// 새로운 조회인지 여부. 새로운 조회라면 기존 데이터는 지우고 새로 검색한 데이터만 사용. 새로운 조회가 아니라면 기존 데이터에 추가 데이터를 추가.
	Bitmap bm = null;				// 가맹점 이미지 저장용

	// 화면 구성
	TextView titleBar;		// 타이틀
	View emptyView;
	ListView listView;
//	Spinner spinnerType;		// 스피너 - 출력 조건 선택 : 가맹점 전체 / 내가 방문한 곳 / 평가 많은 순 / 평가 높은 순

	String[] selectType;		// 조회 옵션

	Button optionBtn1;		//	전체보기	
	Button optionBtn2;		//	방문한곳
	Button optionBtn3;		//	평점순
	Button optionBtn4;		//	방문순
	Button optionBtn5;		//	조건검색

	// 진행바
	ProgressBar pb1;

	// 아답터
	private MemberStoreListAdapter imgAdapter; 

	// 조회 옵션 저장용 도메인
	MerchantSearchOption merchantSearchOptionParam;
	// 가맹점 리스트 저장용 도메인
	public List<Merchant> entries;	// 가맹점 리스트 데이터 처리용
	List<Merchant> entriesFn  = new ArrayList<Merchant>();	// 가맹점 리스트 데이터 처리 후 최종 저장용

	///////////////////////////////////////////////////////////////////////////////////////////////////	

	// 핸들러
	Handler handler = new Handler(){
		@Override
		public void handleMessage(Message msg){
			Bundle b = msg.getData();
			try{
				if(b.getInt("showYN")==1){		// 받아온 마일리지 결과를 화면에 뿌려준다.
					// 최종 결과 배열은 entriesFn 에 저장되어 있다.. 
					if(entriesFn!=null && entriesFn.size()>0){
						/*
						 * 방법 1. 부분 검색 없을때 ##
						 */
//						setGriding();
						
						/*
						 * 방법 2. 부분 검색 할때 ## 
						 */
//						if(newSearch){		// 새로운 검색일 경우 새로 설정, 추가일 경우 알림만 하기 위함.
							setGriding();
//							newSearch = false;		// 다시 돌려놓는다. 이제는 최초 검색이 아님.
//						}else{
//							//							Log.e(TAG,"notifyDataSetChanged");
//							imgAdapter.notifyDataSetChanged();		// 알림 -> 변경사항이 화면상에 업데이트 되도록함.
//						}
							
						listView.setEnabled(true);			// 그리드 뷰 허용함.  // 필요시 gridView.setEnabled(false); @@ 
					}else{
						Log.d(TAG,"no data");
						listView.setEmptyView(emptyView);
						listView.setVisibility(View.GONE);			//   0 visible   4 invisible   8 gone
						emptyView.setVisibility(View.VISIBLE);
					}
					adding = false;		// 조회 및 추가 끝났음. 다른거 조회시 또 추가 가능.. (스크롤 리스너를 다룰때 사용)
					isRunning = 0;		// 진행중이지 않음. - 이후 추가 조작으로 새 조회 가능.
				}
				if(b.getInt("order")==1){
					// 러닝바 실행
					pb1.setVisibility(View.VISIBLE);
				}else if(b.getInt("order")==2){
					// 러닝바 종료
					pb1.setVisibility(View.INVISIBLE);
				}
				if(b.getInt("showErrToast")==1){
					if(getActivity()!=null){
						Toast.makeText(getActivity(), R.string.error_message, Toast.LENGTH_SHORT).show();	
					}
				}
				if(b.getInt("showNetErrToast")==1){
					if(getActivity()!=null){
						Toast.makeText(getActivity(), R.string.network_error, Toast.LENGTH_SHORT).show();	
					}
				}
				// 경고창
				if(b.getInt("showAlert")==1){					 // 경고창 . 
					//
					new AlertDialog.Builder(returnThis())
					.setTitle(CommonConstant. alertTitle )                                        
					.setMessage(b.getString("msg"))
					.setIcon(R.drawable.ic_dialog_img)		
					.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int whichButton) {
							//
						}})
						.setNegativeButton("", null).show();
				}
				
				switch (msg.what)
				{
				case SELECT_SEARCH_RECOMMENDATION_LIST  : 
					if(getActivity()!=null) getActivity().runOnUiThread(new RunnableSelectSearchRecommendationList());		
					break;
				case GET_MERCHANT_INFO   : 
					if(getActivity()!=null) getActivity().runOnUiThread(new RunnableGetMerchantInfo());	
					break;
				default : 
					break;
				}				

			}catch(Exception e){
				e.printStackTrace();
			}
		}
	};

	//////////////////////////////////////////////////////////////////////////////////////////////////////////////


	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
	{
		View view = inflater.inflate(R.layout.fragment_member_store_list, null);

		waitNumberCustomerRest = new WaitNumberCustomerRest();

		selectType = new String[]{
				getActivity().getResources().getString(R.string.store_list_opt_all), 
				getActivity().getResources().getString(R.string.store_list_opt_visit), 
				getActivity().getResources().getString(R.string.store_list_opt_most), 
				getActivity().getResources().getString(R.string.store_list_opt_best)};	// 스피너에 들어갈 조건	= {"가맹점 전체", "방문 했던 곳", "평가 많은 순", "평가 높은 순"};		

		optionBtn1 = (Button)view.findViewById(R.id.opt_btn1);
		optionBtn2 = (Button)view.findViewById(R.id.opt_btn2);
		optionBtn3 = (Button)view.findViewById(R.id.opt_btn3);
		optionBtn4 = (Button)view.findViewById(R.id.opt_btn4);
		optionBtn5 = (Button)view.findViewById(R.id.opt_btn5);

		// 뷰
		titleBar = (TextView) view.findViewById(R.id.title_bar);
		emptyView = view.findViewById(R.id.empty1);
		listView  = (ListView)view.findViewById(R.id.listView);
		
		// 폰트 지정.
	    typefaceNanumGothic = Typeface.createFromAsset(getActivity().getAssets(), CommonConstant.NanumGothic);  
//	    typefaceNanumGothicBold = Typeface.createFromAsset(getActivity().getAssets(), CommonConstant.NanumGothicBold);
	    // 폰트 적용
	    titleBar.setTypeface(typefaceNanumGothic); 
	    optionBtn1.setTypeface(typefaceNanumGothic); 
	    optionBtn2.setTypeface(typefaceNanumGothic); 
	    optionBtn3.setTypeface(typefaceNanumGothic); 
	    optionBtn4.setTypeface(typefaceNanumGothic); 

		
		// 프로그래스 바
		pb1 = (ProgressBar) view.findViewById(R.id.memberstore_list_ProgressBar01);

		searched = false;		 

		// prefs
		sharedPrefCustom = getActivity().getSharedPreferences(CommonConstant.prefName,
				Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE);
		memberId = sharedPrefCustom.getString("qrCode", "");	

//		// spinner
//		spinnerType = (Spinner)view.findViewById(R.id.spinner_type);
//		// spinner listener
//		spinnerType.setOnItemSelectedListener(this);
//		// 스피너 데이터 세팅. 
//		ArrayAdapter<String> aa2 =  new ArrayAdapter<String>(returnThis(), android.R.layout.simple_spinner_item, selectType);
//		aa2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
//		spinnerType.setAdapter(aa2);

//		//전체보기	
		optionBtn1.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				
				// 버튼 이미지 변경
				optionBtn1.setBackgroundDrawable(getResources().getDrawable(R.drawable.sub9_2));
				optionBtn2.setBackgroundDrawable(getResources().getDrawable(R.drawable.sub9_4));
				optionBtn1.setTextColor(Color.WHITE);
				optionBtn2.setTextColor(Color.parseColor("#999999"));
				// 가맹점 전체 검색
				//				merchantSearchOptionParam.setMemberId(memberId);						// 고객 아이디 - 방문했던 가맹점 검색하기 위한 조건. 전체 가맹점 검색시에는 공백
				//				merchantSearchOptionParam.setByTotalMember(byTotalMember);				// 추천평이 많은 순으로 정렬하기 위해 사용되는 조건. TRUE 일때 추천평 많은 순으로 정렬. 그외 공백
				//				merchantSearchOptionParam.setByAverageEvaluation(byAverageEvaluation);	// 평점 높은 순으로 정렬하기 위해 사용되는 조건. TRUE 일때 평점 높은 순으로 정렬. 그외 공백

				//				merchantSearchOptionParam.setCompanyName(companyName);					// 상호명으로 검색시 사용되는 파라미터
				//				merchantSearchOptionParam.setBusinessKind03(businessKind03);				// 업종으로 검색시 사용되는 파라미터
				
				// 전체검색 옵션
				merchantSearchOptionParam.setMemberId("");	
				
//				// 검색 범위 : 전체 검색 or 방문 검색
//				if(searchAllYn.equals("Y")){
//					merchantSearchOptionParam.setMemberId("");
//				}else{
//					merchantSearchOptionParam.setMemberId(memberId);
//				}
//				// 정렬 기준 : 평점높은순 1, 평가많은순 2, 등록순 3 
//				if(averageTotalRegDateOption.equals("1")){						// 평점 높은 순
//					merchantSearchOptionParam.setByAverageEvaluation("TRUE");
//					merchantSearchOptionParam.setByTotalMember("");
//				}else if(averageTotalRegDateOption.equals("2")){				// 평가 많은 순
//					merchantSearchOptionParam.setByAverageEvaluation("");
//					merchantSearchOptionParam.setByTotalMember("TRUE");
//				}else{															// 등록 순
//					merchantSearchOptionParam.setByAverageEvaluation("");
//					merchantSearchOptionParam.setByTotalMember("");
//				}
				// 검색 실행..
				handler.sendEmptyMessage(SELECT_SEARCH_RECOMMENDATION_LIST);
			}
		});
//		//방문한곳	
		optionBtn2.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				
				// 버튼 이미지 변경
				optionBtn1.setBackgroundDrawable(getResources().getDrawable(R.drawable.sub9_4));
				optionBtn2.setBackgroundDrawable(getResources().getDrawable(R.drawable.sub9_2));
				optionBtn1.setTextColor(Color.parseColor("#999999"));
				optionBtn2.setTextColor(Color.WHITE);
				
				// 방문한 곳 조회
				//				merchantSearchOptionParam.setMemberId(memberId);						// 고객 아이디 - 방문했던 가맹점 검색하기 위한 조건. 전체 가맹점 검색시에는 공백
				//				merchantSearchOptionParam.setByTotalMember(byTotalMember);				// 추천평이 많은 순으로 정렬하기 위해 사용되는 조건. TRUE 일때 추천평 많은 순으로 정렬. 그외 공백
				//				merchantSearchOptionParam.setByAverageEvaluation(byAverageEvaluation);	// 평점 높은 순으로 정렬하기 위해 사용되는 조건. TRUE 일때 평점 높은 순으로 정렬. 그외 공백

				//				merchantSearchOptionParam.setCompanyName(companyName);					// 상호명으로 검색시 사용되는 파라미터
				//				merchantSearchOptionParam.setBusinessKind03(businessKind03);				// 업종으로 검색시 사용되는 파라미터
				
				// 방문검색 옵션
				merchantSearchOptionParam.setMemberId(memberId);	
				// 검색 실행..
				handler.sendEmptyMessage(SELECT_SEARCH_RECOMMENDATION_LIST);

			}
		});
//		//평점순
		optionBtn3.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				
				// 버튼 이미지 변경
				optionBtn3.setBackgroundDrawable(getResources().getDrawable(R.drawable.sub9_3));
				optionBtn4.setBackgroundDrawable(getResources().getDrawable(R.drawable.sub9_4));
				optionBtn3.setTextColor(Color.WHITE);
//				optionBtn4.setTextColor(Color.GRAY);
				optionBtn4.setTextColor(Color.parseColor("#999999"));
				
				// 평점 순 정렬
				//				merchantSearchOptionParam.setMemberId(memberId);						// 고객 아이디 - 방문했던 가맹점 검색하기 위한 조건. 전체 가맹점 검색시에는 공백
				//				merchantSearchOptionParam.setByTotalMember(byTotalMember);				// 추천평이 많은 순으로 정렬하기 위해 사용되는 조건. TRUE 일때 추천평 많은 순으로 정렬. 그외 공백
				//				merchantSearchOptionParam.setByAverageEvaluation(byAverageEvaluation);	// 평점 높은 순으로 정렬하기 위해 사용되는 조건. TRUE 일때 평점 높은 순으로 정렬. 그외 공백

				//				merchantSearchOptionParam.setCompanyName(companyName);					// 상호명으로 검색시 사용되는 파라미터
				//				merchantSearchOptionParam.setBusinessKind03(businessKind03);				// 업종으로 검색시 사용되는 파라미터
				
				// 평점 순 정렬
				merchantSearchOptionParam.setByTotalMember("");
				merchantSearchOptionParam.setByAverageEvaluation("TRUE");
				
				// 검색 실행..
				handler.sendEmptyMessage(SELECT_SEARCH_RECOMMENDATION_LIST);

			}
		});
		//	방문순
		optionBtn4.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				
				// 버튼 이미지 변경
				optionBtn3.setBackgroundDrawable(getResources().getDrawable(R.drawable.sub9_4));
				optionBtn4.setBackgroundDrawable(getResources().getDrawable(R.drawable.sub9_3));
//				optionBtn3.setTextColor(Color.GRAY);
				optionBtn3.setTextColor(Color.parseColor("#999999"));
				optionBtn4.setTextColor(Color.WHITE);
				// 평가 많은 순 정렬(평가를 많이 받은 곳을 방문자 수가 많은 곳으로 가정)
				//				merchantSearchOptionParam.setMemberId(memberId);						// 고객 아이디 - 방문했던 가맹점 검색하기 위한 조건. 전체 가맹점 검색시에는 공백
				//				merchantSearchOptionParam.setByTotalMember(byTotalMember);				// 추천평이 많은 순으로 정렬하기 위해 사용되는 조건. TRUE 일때 추천평 많은 순으로 정렬. 그외 공백
				//				merchantSearchOptionParam.setByAverageEvaluation(byAverageEvaluation);	// 평점 높은 순으로 정렬하기 위해 사용되는 조건. TRUE 일때 평점 높은 순으로 정렬. 그외 공백

				//				merchantSearchOptionParam.setCompanyName(companyName);					// 상호명으로 검색시 사용되는 파라미터
				//				merchantSearchOptionParam.setBusinessKind03(businessKind03);				// 업종으로 검색시 사용되는 파라미터
				// 평가순
				merchantSearchOptionParam.setByTotalMember("TRUE");
				merchantSearchOptionParam.setByAverageEvaluation("");
				// 검색 실행..
				handler.sendEmptyMessage(SELECT_SEARCH_RECOMMENDATION_LIST);
			}
		});
		//	조건검색
		optionBtn5.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// 조건 검색 -> 상세 조건 설정하는 액티비티로 이동 
				Intent searchOptionIntent = new Intent(getActivity(), SearchStoreOptionActivity.class);
				startActivityForResult(searchOptionIntent, 5001);
			}
		});

		// 검색 조건을 저장하는 도메인 클래스 생성. 1개로 계속 재사용함.
		merchantSearchOptionParam = new MerchantSearchOption();		// 초기 설정은 "" 처리. 전체조회. 등록순.

		handler.sendEmptyMessage(SELECT_SEARCH_RECOMMENDATION_LIST);		// 리스트를 불러온다.

		return view;
	}

	/////////////////////////////////////////////////////////////////////////////////////////////////////

	// 리스트 보여주고 클릭 이벤트 등록 (가맹점 상세 보기)
	/**
	 * setGriding
	 *   데이터를 화면에 세팅한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void setGriding(){
		imgAdapter = new MemberStoreListAdapter(getActivity(), entriesFn);
		listView.setAdapter(imgAdapter);

		// 클릭시 상세보기 페이지로
		listView.setOnItemClickListener(new OnItemClickListener() {
			public void onItemClick(AdapterView<?> parent, View v,
					int position, long id) {

				Intent intent = new Intent(getActivity(), MemberStoreInfoActivity.class);
				Merchant merchantParam =  entriesFn.get(position);

				intent.putExtra("merchantId", merchantParam.getMerchantId());							//
				intent.putExtra("idRecommendation", merchantParam.getIdRecommendation());							//
				intent.putExtra("creator", merchantParam.getCreator());								//
				intent.putExtra("companyName", merchantParam.getCompanyName());							// 가맹점명
				intent.putExtra("evaluationCount", merchantParam.getEvaluationCount());				// 
				intent.putExtra("evaluationTotal", merchantParam.getEvaluationTotal());				// 
				intent.putExtra("evaluationValue", merchantParam.getEvaluationValue());				// 

				startActivity(intent);
			}	
		});
		listView.setOnScrollListener(listScrollListener);		// 리스너 등록. 스크롤시 하단에 도착하면 추가 데이터 조회하도록.
	}

	///////////////////////////////////////////////////////////////////////////////////////////////////////////	
	// 온 스크롤 이벤트. 
	/**
	 * listScrollListener
	 *   온 스크롤 이벤트이다. 리스트 끝으로 갔을때 추가 이미지가 있다면 로드한다.
	 */
	private OnScrollListener listScrollListener = new OnScrollListener(){
		// 건들기만 하면 주르륵 뜬다.  쓸수 있긴 한데 너무 막떠서  boolean 으로 조절한다.
		@Override
		public void onScroll(AbsListView view, int firstVisibleItem,
				int visibleItemCount, int totalItemCount) {
			if((indexDataFirst + indexDataLast < indexDataTotal)||(indexDataLast!=indexDataTotal)){	// 아직 남음 또는 끝에 도달하지 않음.
				mIsLast = false;
			}
			if((totalItemCount<LIST_ADD_UNIT) ||(indexDataLast==indexDataTotal)){		// LIST_ADD_UNIT개 이하(이미다 보여줌) 또는 마지막=전체 (끝에 도달)
				mIsLast = true;
			}
			// 리스트 가장 하단에 도달했을 경우.. 
			//			if(firstVisibleItem+visibleItemCount==totalItemCount &&(!adding)&&(!mIsLast)){			// 가장 하단.
			if(firstVisibleItem+visibleItemCount>=(totalItemCount-2) &&(!adding)&&(!mIsLast)){		// 가장 하단 -2일때 미리동작? - 좀더 나은듯.
				//				showPb2();
				indexDataTotal = entries.size();
				Log.d(TAG,"onScroll indexDataTotal:"+indexDataTotal);
				handler.sendEmptyMessage(GET_MERCHANT_INFO);
			}
		}
		// 스크롤 시작, 끝, 스크롤 중.. 이라는 사실을 알수 있다.  스크롤중 조회시 에러가 발생하기 때문에 스크롤 중에는 조회가 되지 않도록 한다.. 
		/**
		 * onScrollStateChanged
		 *  스크롤중 조회시 에러가 발생하기 때문에 스크롤 중에는 조회가 되지 않도록 한다.. 
		 *
		 * @param view
		 * @param scrollState
		 * @return
		 */
		@Override
		public void onScrollStateChanged(AbsListView view, int scrollState) {			// status0 : stop  / status1 : touch / status2 : scrolling
			if(scrollState==SCROLL_STATE_IDLE){
				//				searchSpinnerType.setEnabled(true);
				//				searchText.setEnabled(true); 
				//				searchBtn.setEnabled(true);
			}else{
				//				searchSpinnerType.setEnabled(false);
				//				searchText.setEnabled(false); 
				//				searchBtn.setEnabled(false);
			}
		}
	};

	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	

	/*
	 * 스피너. 다른 아이템 선택시, 또는 기존 아이템 선택시에 대한 이벤트. 
	 * 다른거 선택하면 서버 통신하여 조회해온다. 변화 없을시 변화 없음.
	 * (non-Javadoc)
	 * @see android.widget.AdapterView.OnItemSelectedListener#onItemSelected(android.widget.AdapterView, android.view.View, int, long)
	 */
	/**
	 * onItemSelected
	 *  스피너  다른거 선택하면 서버 통신하여 조회해온다
	 *
	 */
	@Override
	public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
			long arg3) {

		//		listView.setEnabled(false);					// 그리드 뷰 허용 안함. 검색 도중 이전 검색 리스트를 스크롤하면 어플 강제 종료됨. -- 인덱스 문제 때문.
		Log.d(TAG,"selectType["+arg2+"]//"+selectType[arg2]);
		//
		//		searchWordType = jobs[arg2];
		//
		//		handler.sendEmptyMessage(GET_MEMBER_STORE_LIST);
	}
	@Override
	public void onNothingSelected(AdapterView<?> arg0) {
		// 스피너 안바꾸면 반응x
	}


	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

	/**
	 * onEditorAction
	 *  검색창에서 엔터를 눌러도 검색되도록 한다
	 *
	 * @param 
	 * @param
	 * @return 
	 */
	@Override
	public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
		switch(v.getId())  
		{  
		case R.id.store_search_text:  
		{  
			if(event.getAction() == KeyEvent.ACTION_DOWN)  		// 엔터시에도 검색 ㄱㄱ
			{  
				//				String searchTxt =  searchText.getText()+"";
				//				//		            	 searchTxt = searchTxt.substring(0, searchTxt.length()-1);	// 엔터 잘라?
				//				searchText.setText(searchTxt);
				//				goSearch();
				return true;
			}  
			break;  
		}  
		}  
		return false;  
	}
	TextWatcher textWatcherInput = new TextWatcher() {  
		@Override  
		public void onTextChanged(CharSequence s, int start, int before, int count) {  
			//		            Log.i("onTextChanged", s.toString());             
		}  
		@Override  
		public void beforeTextChanged(CharSequence s, int start, int count,  
				int after) {  
			//		            Log.i("beforeTextChanged", s.toString());         
		}  
		@Override  
		public void afterTextChanged(Editable s) {  
			//		            Log.i("afterTextChanged", s.toString());  
		}
	};  

	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

	/**
	 * 러너블. 가맹점 목록 가져온다
	 */
	class RunnableSelectSearchRecommendationList implements Runnable {
		public void run(){
			new backgroundSelectSearchRecommendationList().execute();
		}
	}
	/**
	 * backgroundSelectSearchRecommendationList
	 *  비동기로 가맹점 목록 가져온다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public class backgroundSelectSearchRecommendationList extends   AsyncTask<Void, Void, Void> {
		@Override protected void onPostExecute(Void result) { 
		}
		@Override protected void onPreExecute() { 
		}
		@Override protected Void doInBackground(Void... params) { 
			Log. d(TAG,"backgroundSelectSearchRecommendationList");


			// 파리미터 세팅		--> 필요시 그때그때 세팅.
			//			// 호출
			
			if(FragmentHome.restCallCntUp()){
				showPb();
				if(!isFinished){
					/*
					 * 부분 검색 용도. ## 
					 */
					indexDataFirst = 0; // 화면 첫 값 인덱스. 초기화.. 다시 0부터
					indexDataLast = 0;	// 화면에 보여지는 끝값 인덱스. 함께 초기화.. 0부터
					entriesFn.clear();		// 이것도 초기화 해보자. 화면에 보여지는 데이터 리스트.
					newSearch = true;			// 새로운 검색임. true 라면 기존 데이터는 지워야함.

					String callResult = waitNumberCustomerRest.RestSelectSearchRecommendationList(merchantSearchOptionParam);
					// @@ 
					// 조회 이후 업종은 초기화. 상호명도 초기화.
					merchantSearchOptionParam.setBusinessKind03("");
					merchantSearchOptionParam.setCompanyName("");
					
					// 결과 처리		 		// 임시로 막음 @@
					if(!(callResult.equals("F"))){ //  성공		
						if(!isFinished){
							processSelectSearchRecommendationListData(callResult);
						}
					}else{ 					//  실패
						
						showResultDialog(getResources().getString(R.string.request_failed));
						if(!isFinished){
							showInfo(); 
						}
					}
				}
				FragmentHome.restCallCntDown();
			}
			hidePb();
			isRunning = 0;
			return null ;
		}
	}

	/**
	 * 러너블.   가맹점 정보 얻어오는함수 호출
	 */
	class RunnableGetMerchantInfo implements Runnable {
		public void run(){
			new backgroundGetMerchantInfo().execute();
		}
	}
	/**
	 * backgroundGetMerchantInfo
	 *  비동기로 가맹점 정보 얻어오는함수 호출
	 *
	 * @param 
	 * @param
	 * @return 
	 */
	public class backgroundGetMerchantInfo extends  AsyncTask<Void, Void, Void> { 
		@Override protected void onPostExecute(Void result) {  
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundGetMerchantInfo");
			Log.w(TAG, "indexDataTotal::"+indexDataTotal+"//indexDataFirst::"+indexDataFirst+"//indexDataLast::"+indexDataLast+"/adding:"+adding);
			if(indexDataTotal==0){				// 전체 개수가 0일 경우..  보여줌 -> "없습니다"
				showInfo();
			}else{								// 개수가 0이 아닐때.
				if(!((indexDataTotal<indexDataFirst)||(indexDataTotal<indexDataLast))){		// 정상적인 경우
					if(!adding){
						adding = true;
						getMerchantInfo();						// 이미지 데이터를 가져옴
					}
				}else{
					indexDataLast = indexDataTotal;				// 비정상적인 경우. 마지막 데이터가 최대값을 넘겼을때.
					Log.w(TAG, "indexDataTotal::"+indexDataTotal+"//indexDataFirst::"+indexDataFirst+"//indexDataLast::"+indexDataLast);
				}
			}
			return null; 
		}
	}
	
	
	// 가맹점 URL로 이미지 가져오기.가맹점 이미지 URL로부터 이미지 받아와서 도메인에 저장한다. + 결과물에 더하기			-- 2차 검색
	/**
	 * getMerchantInfo
	 *  가맹점 URL로 이미지 가져오기.가맹점 이미지 URL로부터 이미지 받아와서 도메인에 저장한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void getMerchantInfo(){
		try{
			Log.i(TAG, "merchantInfoGet   indexDataLast:"+indexDataLast+",indexDataTotal:"+indexDataTotal);
			// 마지막 인덱스+LIST_ADD_UNIT개가 전체 개수보다 커지면 전체 개수 까지만.
			if(indexDataLast+LIST_ADD_UNIT>=indexDataTotal){
				indexDataLast = indexDataTotal;
				//				mIsLast = true;
				Log.d(TAG,"indexDataLast:"+indexDataLast+",indexDataTotal:"+indexDataTotal );
			}else{		// 전체 개수보다 작다면 LIST_ADD_UNIT 개. 추가 가능.
				indexDataLast = indexDataLast + LIST_ADD_UNIT;
			}
			Log.i(TAG,"indexDataFirst::"+indexDataFirst+"//indexDataLast::"+indexDataLast+"//indexDataTotal::"+indexDataTotal);
			for(int i=indexDataFirst; i<indexDataLast; i++){
				try{
					Merchant tmpMerchant = (Merchant)entries.get(i);
					String tmp_MerchantImageUrl = (tmpMerchant.getMerchantImageUrl()+"");
					if(tmp_MerchantImageUrl!=null && tmp_MerchantImageUrl.length()>0){
						if(tmp_MerchantImageUrl.contains("http")){
							try{
								bm = LoadImage(tmp_MerchantImageUrl);	
							}catch(Exception e2){
								Log.w(TAG,"LoadImage failed();"+tmp_MerchantImageUrl);
								try{
									Thread.sleep(300);
									bm = LoadImage(tmp_MerchantImageUrl);		
								}catch(Exception e3){
									Log.w(TAG,"LoadImage failed again();"+tmp_MerchantImageUrl);
									BitmapDrawable dw = (BitmapDrawable) this.getResources().getDrawable(R.drawable.sub13_2);
									bm = dw.getBitmap();
								}
							}
						}else{
							try{
								bm = LoadImage(imgthumbDomain+tmp_MerchantImageUrl);		
							}catch(Exception e3){
								//								e3.printStackTrace();
								Log.w(TAG, imgthumbDomain+tmp_MerchantImageUrl+" -- fail");
								try{
									BitmapDrawable dw = (BitmapDrawable) this.getResources().getDrawable(R.drawable.sub13_2);
									bm = dw.getBitmap();
								}catch(Exception e4){}
							}
						}
					}else{
						BitmapDrawable dw = (BitmapDrawable) this.getResources().getDrawable(R.drawable.sub13_2);
						bm = dw.getBitmap();
					}

					if(bm==null){
						BitmapDrawable dw = (BitmapDrawable) this.getResources().getDrawable(R.drawable.sub13_2);
						bm = dw.getBitmap();
					}
					tmpMerchant.setMerchantImageBmp(bm);
					entriesFn.add(tmpMerchant);
				}catch(Exception e){
					e.printStackTrace();
					Log.w(TAG,"The I is .."+i);
					//					hidePb2();
				}
			}

			if(indexDataFirst+LIST_ADD_UNIT>indexDataLast){	// 마지막까지 도달했다면 마지막번호.
				indexDataFirst = indexDataLast;
			}else{									// 마지막까지 도달하지 않았다면 +LIST_ADD_UNIT
				indexDataFirst = indexDataFirst + LIST_ADD_UNIT;
			}
			//			Log.d(TAG,"가맹점 정보 수신 완료. ");
			showInfo();
		}catch(Exception e){
			e.printStackTrace();
			//			hidePb2();
			adding = false;
		}
	}



	///////////////////////////////////////////////////////////////////////////////////////////////////

	// 서버에서 받아온  리스트 데이터 처리하여 화면에 뿌려준다.
	public void processSelectSearchRecommendationListData(String callResult){
		try {
			JSONArray jsonArray2 = new JSONArray(callResult);
			int max = jsonArray2.length();
			
			// 부분 검색용 ## 
			indexDataTotal = max;
			Log.w(TAG,"indexDataTotal=max::"+max);
			
			try {
				entries = new ArrayList<Merchant>(max);
				String tmp_merchantId = "";
				String tmp_idRecommendation = "";
				String tmp_creator = "";
				String tmp_companyName = "";
				String tmp_profileThumbnailImageUrl = "";
				String tmp_totalEvaluation = "";
				String tmp_totalMember = "";
				String tmp_averageEvaluation = "";		
				Bitmap bm = null;
				if(max>0){
					for ( int i = 0; i < max; i++ ){
						jsonObject = jsonArray2.getJSONObject(i);
						tmp_merchantId = jsonObject.getString("merchantId");
						try{
							tmp_idRecommendation = jsonObject.getString("idRecommendation");
						}catch(Exception e){
							tmp_idRecommendation = "";
						}
						try{
							tmp_creator = jsonObject.getString("creator");
						}catch(Exception e){
							tmp_creator = "";
						}
						try{
							tmp_companyName = jsonObject.getString("companyName");
						}catch(Exception e){
							tmp_companyName = "";
						}
						try{
							tmp_profileThumbnailImageUrl = jsonObject.getString("profileThumbnailImageUrl");
						}catch(Exception e){
							tmp_profileThumbnailImageUrl = "";
						}
						try{  
							tmp_totalEvaluation = jsonObject.getString("totalEvaluation");
						}catch(Exception e){
							tmp_totalEvaluation = "0";
						}
						try{
							tmp_totalMember = jsonObject.getString("totalMember");
						}catch(Exception e){
							tmp_totalMember = "0";
						}
						try{
							tmp_averageEvaluation = jsonObject.getString("averageEvaluation");
						}catch(Exception e){
							tmp_averageEvaluation = "0";
						}

						// tmp_profileThumbnailImageUrl 있을때.
						if(tmp_profileThumbnailImageUrl!=null && tmp_profileThumbnailImageUrl.length()>0){
							if(tmp_profileThumbnailImageUrl.contains("http")){		// url 포함한 경우
								try{
									bm = LoadImage(tmp_profileThumbnailImageUrl);				 
								}catch(Exception e3){}
							}else{		// url 포함하지 않으면 붙여준다.
								try{
									bm = LoadImage(imgthumbDomain+tmp_profileThumbnailImageUrl);				 
								}catch(Exception e3){
									Log.w(TAG, imgthumbDomain+tmp_profileThumbnailImageUrl+" -- fail");
								}
							}
						}else{
							BitmapDrawable dw = (BitmapDrawable) returnThis().getResources().getDrawable(R.drawable.sub13_2);
							bm = dw.getBitmap();
						}
						if(bm==null){		//  없을때.. 
							BitmapDrawable dw = (BitmapDrawable) returnThis().getResources().getDrawable(R.drawable.sub13_2);
							bm = dw.getBitmap();
						}
						entries.add(new Merchant(tmp_merchantId,
								tmp_idRecommendation,
								tmp_creator,
								tmp_companyName,
								tmp_profileThumbnailImageUrl,
								tmp_totalEvaluation,
								tmp_totalMember,
								tmp_averageEvaluation,
								bm
								// 그 외 섬네일 이미지, 가맹점 이름
						));
					}
				}
			}catch (Exception e) {
				e.printStackTrace();
			}
			
			/*
			 * 1. 부분검색 사용 안할 경우 ##
			 */
//			entriesFn = entries; 
//			showInfo(); 	

			/*
			 * 2. 부분검색 사용할 경우
			 */
			handler.sendEmptyMessage(GET_MERCHANT_INFO);
			
		} catch (Exception e1) {
			e1.printStackTrace();
		}
	}

	/////////////////////////////////////////////////////////////////////////////////////////////////////////


	// 가맹점 이미지 URL 에서 이미지 받아와서 도메인에 저장하는 부분.
	/**
	 * LoadImage
	 *  가맹점 이미지 URL 에서 이미지 받아온 스트림을 비트맵으로 저장한다
	 *
	 * @param $imagePath
	 * @param
	 * @return bm
	 */
	private Bitmap LoadImage( String $imagePath ) {
		InputStream inputStream = OpenHttpConnection( $imagePath ) ;
		Bitmap bm = BitmapFactory.decodeStream( inputStream ) ;
		return bm;
	}
	/**
	 * OpenHttpConnection
	 *  가맹점 이미지 URL 에서 이미지 받아와서 스트림으로 저장한다
	 *
	 * @param $imagePath
	 * @param
	 * @return stream
	 */
	private InputStream OpenHttpConnection(String $imagePath) {
		InputStream stream = null ;
		try {
			URL url = new URL( $imagePath ) ;
			HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection() ;
			urlConnection.setRequestMethod( "GET" ) ;
			urlConnection.connect() ;
			if( urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK ) {
				stream = urlConnection.getInputStream() ;
			}
		} catch (MalformedURLException e) {
			Log.w(TAG,"MalformedURLException");
		} catch (IOException e) {
			Log.w(TAG,"IOException");
		}
		return stream ;
	}

	/////////////////////////////////////////////////////////////////////////////////////////////////////////

	@Override
	public void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		Bundle extraBundle;
		if( requestCode == 5001 ) {
			if(resultCode == Activity.RESULT_OK){		// 정상 반환시.
				Log.d(TAG,"RESULT_OK");
				//				Log.d(TAG,"onActivityResult//5001");
				extraBundle = data.getExtras();		// 번들을 반환했으니까 번들을 불러오면 세팅된 값을 가지고 있음.

				//				merchantSearchOptionParam.setMemberId(memberId);						// 고객 아이디 - 방문했던 가맹점 검색하기 위한 조건. 전체 가맹점 검색시에는 공백
				//				merchantSearchOptionParam.setByTotalMember(byTotalMember);				// 추천평이 많은 순으로 정렬하기 위해 사용되는 조건. TRUE 일때 추천평 많은 순으로 정렬. 그외 공백
				//				merchantSearchOptionParam.setByAverageEvaluation(byAverageEvaluation);	// 평점 높은 순으로 정렬하기 위해 사용되는 조건. TRUE 일때 평점 높은 순으로 정렬. 그외 공백

				//				merchantSearchOptionParam.setCompanyName(companyName);					// 상호명으로 검색시 사용되는 파라미터
				//				merchantSearchOptionParam.setBusinessKind03(businessKind03);				// 업종으로 검색시 사용되는 파라미터
				
				// --> 전체 검색 여부와 정렬순서는 자체 화면에 있는 값을 사용한다. 가져온값 사용안함.
//				String searchAllYn = extraBundle.getString("searchAllYn");	 							// 전체 검색 여부	Y 이면 전체 검색, N 이면 방문만 검색
//				String averageTotalRegDateOption = extraBundle.getString("averageTotalRegDateOption");	// 평점높은순 1/ 평가 많은순 2/ 등록순 3
//				Log.d(TAG,"searchAllYn:"+searchAllYn);							
//				Log.d(TAG,"averageTotalRegDateOption:"+averageTotalRegDateOption);
//				// 검색 범위 : 전체 검색 or 방문 검색
//				if(searchAllYn.equals("Y")){
//					merchantSearchOptionParam.setMemberId("");
//				}else{
//					merchantSearchOptionParam.setMemberId(memberId);
//				}
//				// 정렬 기준 : 평점높은순 1, 평가많은순 2, 등록순 3 
//				if(averageTotalRegDateOption.equals("1")){						// 평점 높은 순
//					merchantSearchOptionParam.setByAverageEvaluation("TRUE");
//					merchantSearchOptionParam.setByTotalMember("");
//				}else if(averageTotalRegDateOption.equals("2")){				// 평가 많은 순
//					merchantSearchOptionParam.setByAverageEvaluation("");
//					merchantSearchOptionParam.setByTotalMember("TRUE");
//				}else{															// 등록 순
//					merchantSearchOptionParam.setByAverageEvaluation("");
//					merchantSearchOptionParam.setByTotalMember("");
//				}
				// --> 기존 검색 조건 그대로 사용
				
				String searchCompanyName = extraBundle.getString("searchCompanyName");	 				// 상호명 검색시 파라미터
				String searchBusinessKind03 = extraBundle.getString("searchBusinessKind03");	 			// 업종 선택시 파라미터
				Log.d(TAG,"searchCompanyName:"+searchCompanyName);		
				Log.d(TAG,"searchBusinessKind03:"+searchBusinessKind03);
				merchantSearchOptionParam.setCompanyName(searchCompanyName);
				merchantSearchOptionParam.setBusinessKind03(searchBusinessKind03);
				//				merchantSearchOptionParam.setBusinessKind03("");
				// 검색 실행..
				handler.sendEmptyMessage(SELECT_SEARCH_RECOMMENDATION_LIST);	// @@ 보류
			}else if(resultCode == Activity.RESULT_CANCELED){
				Log.d(TAG,"RESULT_CANCELED");
			}
		}
	}


	/////////////////////////////////////////////////////////////////////////////////////////////////////////


	public void alertToUser(){				// 	data 조회가 잘 안됐어요. // 별도 알림 없이 로그만 찍는다.
		Log.d(TAG,"Get Data from Server -> Error Occured..");
	}


	/**
	 * showInfo
	 *  결과 도메인을 화면에 뿌려준다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showInfo(){
		hidePb();
		//  가져온 데이터 화면에 보여주기.
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();
						Bundle b = new Bundle();
						b.putInt("showYN", 1);
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	}

	/**
	 * returnThis
	 *  컨택스트를 리턴한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public Context returnThis(){
		return getActivity();
	}
	
	/**
	 * showResultDialog
	 *  얼럿 띄운다
	 *
	 * @param msg
	 * @param
	 * @return 
	 */
	public void showResultDialog(final String msg){
		if(!isFinished){
			getActivity().runOnUiThread(new Runnable(){		 
				@Override
				public void run(){
					Message message = handler.obtainMessage();				
					Bundle b = new Bundle();
					b.putInt("showAlert", 1);
					b.putString("msg", msg);			// 화면에 보여줄 메시지
					message.setData(b);
					handler.sendMessage(message);
				}
			});
		}
	}
	
	// 진행바 보임 / 숨김
	/**
	 * showPb
	 *  중앙 프로그래스바 가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showPb(){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();
						Bundle b = new Bundle();
						b.putInt("order", 1);
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	}
	/**
	 * hidePb
	 *  중앙 프로그래스바 비가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void hidePb(){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();
						Bundle b = new Bundle();
						b.putInt("order", 2);
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	}

	/**
	 * onResume
	 *  마일리지 리스트 조회가 되지 않았다면 액티비티 리쥼시 마일리지 리스트를 재조회한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	@Override
	public void onResume(){
		super.onResume();
		isFinished = false;
		FragmentHome.app_end = 0;
	}

	@Override
	public void onPause(){
		super.onPause();
		isFinished = true;
	}
	/////////////////////////////////////////////////////////////////////////////////////////////////////////	

}

